/*
 * @(#)NumberConvert.java 1.0.0 2011/03/22
 *
 * Copyright 2011 Ice Spring All rights reserved.
 * Mrogrape/Javaliang.com PROPRIETARY.
 */
package com.mrogrape.util;

/**
 * 这个类可以用来获取一个非负整数的汉语表示形式，如“一千零二十四”（1024）。
 * <br>转换方案遵守中国大陆书面语基本规则，具体组织规则为
 * <ul>
 * <li>所有位不为零时必须显示单位。
 * <li>所有的〇后均不能跟除了万和亿之外的单位。
 * <li>每四位中连续的〇只显示一个（如一千〇〇一只显示一千〇一）。
 * <li>从低位开始按每组八位将数字分组，若某个组所有位全为零则不显示万单位。
 * </ul>
 * 另外，为了更符合中国人的表达习惯，一十到一十九将被简称为十到十九。
 * 
 * @author Ice Spring
 * @version 1.0.0 2011/03/22
 */
public class NumberConvert {

	/**
	 * 以小写（一，二，三...）形式获取非负整数的汉语表示形式。
	 * 
	 * @param n 一个非负整数。
	 * @return 该非负整数的汉语小写形式。
	 */
	public static String toChineseInLowercase(Long n){
		if(n<0){
			throw new IllegalArgumentException("The number must be max than zero!");
		}
		StringBuffer re = new StringBuffer();

		String no = String.valueOf(n);
		int length = no.length();

		re.insert(0, NumberConvert.convertToChinese(no.charAt(length-1)));
		if(length > 1){
			for(int i = 2 ; i < length+1 ;i++)
			{	

				if((i-2)%8==0){
					if(no.charAt(length-i)=='0')
					{
						re.insert(0, NumberConvert.convertToChinese(no.charAt(length-i)));
						continue;
					}
					re.insert(0, NumberConvert.SHI_L);
				} else if((i-2)%8 == 1){
					if(no.charAt(length-i)=='0')
					{
						re.insert(0, NumberConvert.convertToChinese(no.charAt(length-i)));
						continue;
					}
					re.insert(0, NumberConvert.BAI_L);
				} else if((i-2)%8 == 2){
					if(no.charAt(length-i)=='0')
					{
						re.insert(0, NumberConvert.convertToChinese(no.charAt(length-i)));
						continue;
					}
					re.insert(0, NumberConvert.QIAN_L);
				} else if((i-2)%8 == 3){
					re.insert(0, NumberConvert.WAN_L);
				} else if((i-2)%8 == 4){
					if(no.charAt(length-i)=='0')
					{
						re.insert(0, NumberConvert.convertToChinese(no.charAt(length-i)));
						continue;
					}
					re.insert(0, NumberConvert.SHI_L);
				} else if((i-2)%8 == 5){
					if(no.charAt(length-i)=='0')
					{
						re.insert(0, NumberConvert.convertToChinese(no.charAt(length-i)));
						continue;
					}
					re.insert(0, NumberConvert.BAI_L);
				} else if((i-2)%8 == 6){
					if(no.charAt(length-i)=='0')
					{
						re.insert(0, NumberConvert.convertToChinese(no.charAt(length-i)));
						continue;
					}
					re.insert(0, NumberConvert.QIAN_L);
				} else if((i-2)%8 == 7){
					re.insert(0, NumberConvert.YI_L);
				}

				re.insert(0, NumberConvert.convertToChinese(no.charAt(length-i)));
			}
		}
		String result = re.toString();
		while(result.endsWith(NumberConvert.ZERO_L)&&result.length()!=1){
			result = result.substring(0, result.length()-1);
		}
		if(result.startsWith(NumberConvert.ONE_L+NumberConvert.SHI_L))
		{
			result = result.substring(1, result.length());
		}
		result = result.replace(NumberConvert.ZERO_L+NumberConvert.ZERO_L+NumberConvert.ZERO_L+NumberConvert.ZERO_L, NumberConvert.ZERO_L);
		result = result.replace(NumberConvert.ZERO_L+NumberConvert.ZERO_L+NumberConvert.ZERO_L,NumberConvert.ZERO_L);
		result = result.replace(NumberConvert.ZERO_L+NumberConvert.ZERO_L,NumberConvert.ZERO_L);
		result = result.replace(NumberConvert.ZERO_L+NumberConvert.WAN_L, NumberConvert.WAN_L);
		result = result.replace(NumberConvert.YI_L+NumberConvert.WAN_L, NumberConvert.YI_L);
		result = result.replace(NumberConvert.ZERO_L+NumberConvert.YI_L, NumberConvert.YI_L);
		return result;
	}

	/**
	 * 以大写（壹，贰...）形式获取非负整数的汉语表示形式。
	 * 
	 * @param n 一个非负整数。
	 * @return 该非负整数的汉语大写形式。
	 */
	public static String toChineseInUppercase(Long n){
		if(n<0){
			throw new IllegalArgumentException("The number must be max than zero!");
		}
		StringBuffer re = new StringBuffer();

		String no = String.valueOf(n);
		int length = no.length();

		re.insert(0, NumberConvert.convertToChineseInUppercase(no.charAt(length-1)));
		if(length > 1){
			for(int i = 2 ; i < length+1 ;i++)
			{	

				if((i-2)%8==0){
					if(no.charAt(length-i)=='0')
					{
						re.insert(0, NumberConvert.convertToChineseInUppercase(no.charAt(length-i)));
						continue;
					}
					re.insert(0, NumberConvert.SHI_U);
				} else if((i-2)%8 == 1){
					if(no.charAt(length-i)=='0')
					{
						re.insert(0, NumberConvert.convertToChineseInUppercase(no.charAt(length-i)));
						continue;
					}
					re.insert(0, NumberConvert.BAI_U);
				} else if((i-2)%8 == 2){
					if(no.charAt(length-i)=='0')
					{
						re.insert(0, NumberConvert.convertToChineseInUppercase(no.charAt(length-i)));
						continue;
					}
					re.insert(0, NumberConvert.QIAN_U);
				} else if((i-2)%8 == 3){
					re.insert(0, NumberConvert.WAN_U);
				} else if((i-2)%8 == 4){
					if(no.charAt(length-i)=='0')
					{
						re.insert(0, NumberConvert.convertToChineseInUppercase(no.charAt(length-i)));
						continue;
					}
					re.insert(0, NumberConvert.SHI_U);
				} else if((i-2)%8 == 5){
					if(no.charAt(length-i)=='0')
					{
						re.insert(0, NumberConvert.convertToChineseInUppercase(no.charAt(length-i)));
						continue;
					}
					re.insert(0, NumberConvert.BAI_U);
				} else if((i-2)%8 == 6){
					if(no.charAt(length-i)=='0')
					{
						re.insert(0, NumberConvert.convertToChineseInUppercase(no.charAt(length-i)));
						continue;
					}
					re.insert(0, NumberConvert.QIAN_U);
				} else if((i-2)%8 == 7){
					re.insert(0, NumberConvert.YI_U);
				}

				re.insert(0, NumberConvert.convertToChineseInUppercase(no.charAt(length-i)));
			}
		}
		String result = re.toString();
		while(result.endsWith(NumberConvert.ZERO_U)&&result.length()!=1){
			result = result.substring(0, result.length()-1);
		}
		if(result.startsWith(NumberConvert.ONE_U+NumberConvert.SHI_U))
		{
			result = result.substring(1, result.length());
		}
		result = result.replace(NumberConvert.ZERO_U+NumberConvert.ZERO_U+NumberConvert.ZERO_U+NumberConvert.ZERO_U, NumberConvert.ZERO_U);
		result = result.replace(NumberConvert.ZERO_U+NumberConvert.ZERO_U+NumberConvert.ZERO_U,NumberConvert.ZERO_U);
		result = result.replace(NumberConvert.ZERO_U+NumberConvert.ZERO_U,NumberConvert.ZERO_U);
		result = result.replace(NumberConvert.ZERO_U+NumberConvert.WAN_U, NumberConvert.WAN_U);
		result = result.replace(NumberConvert.YI_U+NumberConvert.WAN_U, NumberConvert.YI_U);
		result = result.replace(NumberConvert.ZERO_U+NumberConvert.YI_U, NumberConvert.YI_U);
		return result;
	}

	private static String convertToChinese(char n){
		String re = NumberConvert.ZERO_L;
		switch(n){
			case '1':
				re = NumberConvert.ONE_L;
				break;
			case '2':
				re = NumberConvert.TWO_L;
				break;
			case '3':
				re = NumberConvert.THREE_L;
				break;
			case '4':
				re = NumberConvert.FOUR_L;
				break;
			case '5':
				re = NumberConvert.FIVE_L;
				break;
			case '6':
				re = NumberConvert.SIX_L;
				break;
			case '7':
				re = NumberConvert.SEVEN_L;
				break;
			case '8':
				re = NumberConvert.EIGHT_L;
				break;
			case '9':
				re = NumberConvert.NINE_L;
				break;
			case '0':
				re = NumberConvert.ZERO_L;
				break;
		}
		return re;
	}

	private static String convertToChineseInUppercase(char n){
		String re = NumberConvert.ZERO_U;
		switch(n){
			case '1':
				re = NumberConvert.ONE_U;
				break;
			case '2':
				re = NumberConvert.TWO_U;
				break;
			case '3':
				re = NumberConvert.THREE_U;
				break;
			case '4':
				re = NumberConvert.FOUR_U;
				break;
			case '5':
				re = NumberConvert.FIVE_U;
				break;
			case '6':
				re = NumberConvert.SIX_U;
				break;
			case '7':
				re = NumberConvert.SEVEN_U;
				break;
			case '8':
				re = NumberConvert.EIGHT_U;
				break;
			case '9':
				re = NumberConvert.NINE_U;
				break;
			case '0':
				re = NumberConvert.ZERO_U;
				break;
		}
		return re;
	}

	/**
	 * 0的大写表示形式
	 */
	public static final String ZERO_U = "\u96f6";
	/**
	 * 1的大写表示形式
	 */
	public static final String ONE_U = "\u58f9";
	/**
	 * 2的大写表示形式
	 */
	public static final String TWO_U = "\u8cb3";
	/**
	 * 3的大写表示形式
	 */
	public static final String THREE_U = "\u53c1";
	/**
	 * 4的大写表示形式
	 */
	public static final String FOUR_U = "\u8086";
	/**
	 * 5的大写表示形式
	 */
	public static final String FIVE_U = "\u4f0d";
	/**
	 * 5的大写表示形式
	 */
	public static final String SIX_U = "\u9678";
	/**
	 * 7的大写表示形式
	 */
	public static final String SEVEN_U = "\u67d2";
	/**
	 * 8的大写表示形式
	 */
	public static final String EIGHT_U = "\u634c";
	/**
	 * 9的大写表示形式
	 */
	public static final String NINE_U = "\u7396";

	/**
	 * 大写十“拾”
	 */
	public static final String SHI_U = "\u62fe";
	/**
	 * 大写百“佰”
	 */
	public static final String BAI_U = "\u4f70";
	/**
	 * 大写千“仟”
	 */
	public static final String QIAN_U = "\u4edf";
	/**
	 * 大写万“萬”
	 */
	public static final String WAN_U = "\u842c";
	/**
	 * 大写亿
	 */
	public static final String YI_U = "\u5104";

	/**
	 * 0的小写表示形式
	 */
	public static final String ZERO_L = "\u3007";
	/**
	 * 1的小写表示形式
	 */
	public static final String ONE_L = "\u4e00";
	/**
	 * 2的小写表示形式
	 */
	public static final String TWO_L = "\u4e8c";
	/**
	 * 3的小写表示形式
	 */
	public static final String THREE_L = "\u4e09";
	/**
	 * 4的小写表示形式
	 */
	public static final String FOUR_L = "\u56db";
	/**
	 * 5的小写表示形式
	 */
	public static final String FIVE_L = "\u4e94";
	/**
	 * 6的小写表示形式
	 */
	public static final String SIX_L = "\u516d";
	/**
	 * 7的小写表示形式
	 */
	public static final String SEVEN_L = "\u4e03";
	/**
	 * 8的小写表示形式
	 */
	public static final String EIGHT_L = "\u516b";
	/**
	 * 9的小写表示形式
	 */
	public static final String NINE_L = "\u4e5d";
	/**
	 * 小写十“十”
	 */
	public static final String SHI_L = "\u5341";
	/**
	 * 小写百“百”
	 */
	public static final String BAI_L = "\u767e";
	/**
	 * 小写千“千”
	 */
	public static final String QIAN_L = "\u5343";
	/**
	 * 小写万“万”
	 */
	public static final String WAN_L = "\u4e07";
	/**
	 * 小写亿“亿”
	 */
	public static final String YI_L = "\u4ebf";
}
